#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<sys/shm.h>
#include<errno.h>


#define FTOK_PATH 		"/dev/zero"
#define FTOK_PROJID		0x22
typedef struct st_student
{
	char		name[64];
	int		age;
}t_student;



int main()
{
	key_t		key;
	int		shmid;
	int		i;
	t_student	*student;


	//获取关键字ID 通常是文件索引节点号加key_t返回值
	if((key=ftok(FTOK_PATH,FTOK_PROJID))<0)
	{
		printf("ftok() get IPC token failure: %s\n",strerror(errno));
		return -1;
	}

	//创建共享内存，成功返回一个非负整数，失败返回-1
	shmid=shmget(key,sizeof(t_student),IPC_CREAT|0666);

	if(shmid<0)
	{
		printf("shmid() create shared memory failure: %s\n",strerror(errno));
		return -2;
	}

	//启动对该内存的访问，并把共享内存连接到当前进程的地址空间。调用成功时返回一个指向共享内存第一个字节的指针，如果失败返回-1
	//shmid,shmaddr指定共享内存连接到当前进程中的地址位置，通常为空，表示让系统来选择共享内存的地址。hmflg是一组标志位，通常为0。
	student=shmat(shmid,NULL,0);

	if((void *)-1==student)
	{
		printf("shmat() alloc shared memory failure%s\n",strerror(errno));
		return -2;
	}


	for(i=0;i<4;i++)
	{
		student->age++;
		printf("Student : %s age [%d] \n",student->name,student->age);
		sleep(1);
	}

	shmctl(shmid,IPC_RMID,NULL);

	return 0;

}




